/*#pragma once
#include <vector>
#include <utility>
#include <string>
#include <cstring>

using namespace std;

typedef unsigned int Symbol_index;
typedef unsigned int stmt_number;
typedef unsigned int line_number;

enum attrName {procName, varName, value, stmtNum};
enum RELATIONTYPE {MODIFIESP, MODIFIESS, USESP, USESS, CALLS, CALLST, PARENT, PARENTT, FOLLOWS, FOLLOWST, NEXT, NEXTT, AFFECTS, AFFECTST};
enum design_entity {procedure, stmtLst, stmt, assign, call, while_, if_, variable};
enum ResultElementType {BOOLEAN, Symbol, attributeRef};
enum ParameterType {number, Symbol};

struct ResultElement {
	ResultElementType type;
	Symbol syn;
	attrRef attrReference;
};

class Symbol {
public:
	Symbol(string name, design_entity type);
	string getName();
	design_entity getType();
private:
	string name;
	design_entity type;
};

class SymbolList {
public:
	Symbol_index add(Symbol s);
	Symbol getSymbol(Symbol_index index);
	Symbol_index getIndex(Symbol s);

private:
	vector<Symbol> list;
};

struct Relation {
	RELATIONTYPE type;
	ParameterType para1Type;
	ParameterType para2Type;
	Symbol parameter1;			//only has a value if para1Type is Symbol
	Symbol parameter2;			//only has a value if para2Type is Symbol
	line_number parameter1;		//only has a value if para1Type is number
	line_number parameter2;
};

struct attrRef{
	Symbol syn;
	attrName attribute;
};

class QueryTree {
public:
	vector<ResultElement> getResultClause();
	vector<Relation> getRelation();
	SymbolList getSymbols();
	// get size etc

private:
	vector<ResultElement> resultClause;
	vector<Relation>  suchThatClause;
	SymbolList variables;
};*/